package com.itheima.d5_block;
/*

静态代码块和实例代码块都在类中方法外

静态代码块:
    格式：static { }
    特点：类加载时自动执行，由于类只会加载一次，所以静态代码块也只会执行一次。
    作用：完成类的初始化，例如：对类变量的初始化赋值。

实例代码块:
    格式：{ }
    特点：每次创建对象时，执行实例代码块，并在构造器前执行。
    作用：和构造器一样，都是用来完成对象的初始化的，例如：对实例变量进行初始化赋值。
 */
public class Student {
    //类变量（静态变量）
    static int number = 80;
    static String schoolName = "黑马";

    //实例变量（非静态变量）
    int score;
    int count;


    // 静态代码块
    static {
        System.out.println("静态代码块执行");
        number = 100;
        schoolName = "传智";

        //不能初始化实例变量
//        score = 100; //报错：Non-static field 'score' cannot be referenced from a static context
    }


    // 实例代码块
    {
        System.out.println("实例代码块执行");
        count = 50; //在实例代码块中写了，就可以不用在构造器中写了 ---> 减少代码冗余
    }


    //构造器
    public Student() {
        System.out.println("无参构造器执行");
        score = 100;
//        count = 50;
    }

    public Student(int score) {
        this.score = score;
        System.out.println("有参构造器执行");
//        count = 50;
    }


    //其他方法

    public void test1() {
        //在方法（局部位置）中出现的代码块成为局部代码块

        //方法中的局部代码块
        //局部代码块的作用：限定局部变量的作用域
        int a = 10;
        {
            System.out.println(a);

            int b = 20;
            System.out.println("b = " + b);
        }
        System.out.println(a);
//        System.out.println("b = " + b); //报错：Cannot resolve symbol 'b' ---> 超出了局部变量b的作用域
    }

    /*
    局部代码块通常结合 if for while，单独使用较少

    if(){
    }

    for(){
    }

    while(){
    }
     */
}



